/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.google.mendoza.malbec;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.globant.google.mendoza.malbec.schema._2.ErrorResponse;

/**
 * Exception created when an error code is recieved from the server through
 * http.
 */
public class MalbecHttpErrorCodeException extends RuntimeException {

  /** The serial version id to serialize the class.
   */
  private static final long serialVersionUID = 5679804334708415373L;

  /** The class logger.
   */
  private static Log log = LogFactory.getLog(
      MalbecHttpErrorCodeException.class);

  /**
   * The error message obtained in the response from Malbec.
   */
  private String responseMessage = null;

  /**
   * The error code number.
   */
  private int responseCode = 0;

  /**
   * Creates a {@link MalbecHttpErrorCodeException}.
   * @param message The message for the exception.
   * @param errorCode The error code number.
   * @param response The response obtained for the http request.
   */
  public MalbecHttpErrorCodeException(final String message, final int errorCode,
      final String response) {
    super(message);
    responseCode = errorCode;
    processResponse(response);
  }

  /**
   * Creates a {@link MalbecHttpErrorCodeException}.
   * @param message The message for the exception.
   * @param errorCode The error code number.
   * @param response The response obtained for the http request.
   * @param cause A {@link Throwable} object that caused this exception.
   */
  public MalbecHttpErrorCodeException(final String message, final int errorCode,
      final String response, final Throwable cause) {
    super(message, cause);
    responseCode = errorCode;
    processResponse(response);
  }

  /**
   * Transforms the xml response into a jaxb object, and then store it's
   * contents.
   * @param response the xml response content.
   */
  private void processResponse(final String response) {
    try {
      ErrorResponse errorResponse =
        (ErrorResponse) CartUtils.unmarshal(response).getValue();
      this.responseMessage = errorResponse.getErrorMessage();
    } catch (Exception e) {
      // In case the message cannot be parsed, assign a default value to it.
      //log.warn("Could not parse message", e);
      log.warn("Could not parse message");
      log.warn("Using default value for response message");
      this.responseMessage = "The message could not be parsed.";
    }
  }

  /**
   * Returns the error response message obtained. Null means no message
   * obtained.
   * @return the error response message obtained.
   */
  public final String getResponseMessage() {
    return responseMessage;
  }

  /**
   * Returns the error response code. 0 means no error code obtained.
   * @return the error response code.
   */
  public final int getResponseCode() {
    return responseCode;
  }
}
